<?php
/**
 * php 数组
 */

$arr = [
    'key' => 'value'
];

//索引数组、关联数组
$arr = [1, 2, 3];

$brr = ['n' => 1, 'm' => 2, 'f' => 3];

//一维数组、多维数组
$arr = [1, 2, 3];

$multi_arr = [
    [1, 2, 3],
    [4, 5, 6],
];

// 获取数组长度
$count = count($arr);
print_r($count);
echo PHP_EOL;
// count() 参数不是数组时
// echo count(null); // 结果为0，抛出 warning
// echo count('string'); // 结果为1，抛出 warning
// echo count(0); // 结果为1，抛出 warning
// echo count(1); // 结果为1，抛出 warning


// 遍历数组
$arr = ['a', 'b', 'c', 'd'];
// for
for ($i = 0; $i < count($arr); $i++) {
    //echo current($arr);
    echo $arr[$i] . PHP_EOL;
}

// foreach
foreach ($arr as $key => $value) {
    // 遍历数组, 使用current()输出数组指针指向的当前单元的值
    echo current($arr) . ' ';
    echo 'key is ' . $key . ' value is ' . $value . PHP_EOL;
}

// list
list($a, $b, $c) = $arr;
echo 'a=' . $a . ' b=' . $b . ' c=' . $c . PHP_EOL;

// 数组与字符串的转换
$str = implode($arr, ',');
print_r($str);
$brr = explode(',', $str);
print_r($brr);


// 数组排序
$sort = ['p' => 1, 'a' => 3, 'f' => 5];
ksort($sort); // 根据键对数组进行升序排序
print_r($sort); // ['a' => 3, 'f' => 5, 'p' => 1]


// 常见内置函数

// array_push()将一个或多个单元压入数组的末尾(入栈)
$arr = ['php', 'go'];
array_push($arr, 'java', 'js', ['css', 'html']);
// 如果仅仅是插入一个单元，官方推荐
$arr[] = 'a';
print_r($arr);
echo PHP_EOL;
// array_pop() 将数组最后一个单元弹出（出栈）
array_pop($arr);
print_r($arr);
echo PHP_EOL;

// array_shift()将数组开头的单元移出数组 array_unshift()在数组开头插入一个或多个单元
array_shift($arr);
print_r($arr);
array_unshift($arr, 'vue');
print_r($arr);

// array_sum 返回数组中所有值的和 array_product 计算数组中所有值的乘积
echo array_sum([1, 2, 3, 'b']); // 结果 6， 无法计算的则跳过
echo PHP_EOL;
echo array_product([1, 2, 3, 'c']); // 结果 0，无法计算的则为0
echo PHP_EOL;

// array_keys 返回数组中所有的键名 array_values 返回数组中所有的值
$arr = [
    'key1' => 'value1',
    'key2' => 'value2',
];
$arr_keys = array_keys($arr);
print_r($arr_keys);
$arr_values = array_values($arr);
print_r($arr_values);

// array_unique 移除数组中重复的值,且保留原索引
$arr_repeat = [1, 1, 3, 3, 5, 6, 7, 7];
$arr = array_unique($arr_repeat);
print_r($arr);

// in_array 检查数组中是否存在某个值
$code = 'p';
$res = in_array($code, ['p', 'd', 'f']);// true


//array_filter 过滤数组  array_map 遍历数组
$arr_filter = [1, 1, 3, 3, 5, 6, 7, 7];
$filter = array_filter($arr_filter, function ($val) {
    return $val > 6;
});
$arr_filter = [
    ['name' => 'test', 'age' => 1],
    ['name' => 'test1', 'age' => 3],
    ['name' => 'test2', 'age' => 5],
];
$filter = array_filter($arr_filter, function ($val) {
    return $val['age'] > 3;
});
print_r($filter);

$map = array_map(function ($val) {
    $val['age'] = $val['age'] + 8;
    return $val;
}, $arr_filter);
print_r($map);


// array_merge 合并数组
$database = [
    'host' => '127.0.0.1',
    'port' => '3306',
    'read' => [
        'host' => '127.0.0.1',
        'user' => 'root',
        'pass' => 'root123',
    ],
    'write' => [
        'host' => '127.0.0.1',
        'user' => 'root',
        'pass' => 'root123',
    ],
];
$database = array_merge($database, ['user' => 'root',]);
// print_r($database);


// 处理数组键值大小写
//$database = array_change_key_case($database, CASE_UPPER);
// print_r($database);

// 递归处理数组键大小写
function bubble_array_change_key_case($database, $case = CASE_LOWER)
{
    foreach ($database as $key => $value) {
        $action = $case == CASE_UPPER ? 'strtoupper' : 'strtolower';
        unset($database[$key]);
        $database[$action($key)] = is_array($value) ? bubble_array_change_key_case($value, $case) : $value;
    }

    return $database;
}

// $database = bubble_array_change_key_case($database, CASE_UPPER);
// print_r($database);

// 递归处理数组值大小写
function bubble_array_change_value_case($database, $case = CASE_LOWER)
{
    foreach ($database as $key => $value) {
        $action = $case == CASE_UPPER ? 'strtoupper' : 'strtolower';
        $database[$key] = is_array($value) ? bubble_array_change_value_case($value, $case) : $action($value);
    }

    return $database;
}

// $database = bubble_array_change_value_case($database, CASE_UPPER);
// print_r($database);

// array_walk_recursive 应用场景

// 需求 取多维数组 所有的键 或 所有的值
$m = [
    'key1' => 'value1',
    'key2' => 'value2',
    'key3' => 'value3',
];
$arr_key = [];
array_walk_recursive($m, function ($value, $key) use (&$arr_key) {
    array_push($arr_key, $key);
});

$arr_value = [];
array_walk_recursive($m, function ($value, $key) use (&$arr_value) {
    array_push($arr_value, $value);
});

// print_r($arr_key);
// print_r($arr_value);

// 递归处理数组值大小写
array_walk_recursive($database, function (&$value, $key) {
    $value = strtoupper($value);
});
print_r($database);